--- title: Title keywords: fastai sidebar: home_sidebar summary: "summary" ---
import math
import commons.M100_Fluke_dirs as dirs
import pandas
import library.inference_utils as iu
from fastai.vision import *
from torchsummary import summary
%reload_ext autoreload
%autoreload 2
%matplotlib inline
dirs.set_base_path('/home/john/github/data/FEC/03-M100-Fluke-2019-11')
dirs.model = dirs.model+'/export-fluke-2019-12-01.pkl'
dirs.printdirs(dir(dirs))
path = Path(dirs.basepath)/'Crop-200'
path_img = path/'Train'
path_lbl = path/'Label'
path_tst = path/'Test'
fnames = get_image_files(path_tst)
print (f'Number of test tiles {len(fnames)}')
# defaults.device = 'cpu'
defaults.device = 'cuda'
def acc_metric1(input, target):
target = target.squeeze(1)
return (input.argmax(dim=1)==target).float().mean()
def acc_metric2(input, target):
target = target.squeeze(1)
return (input.argmax(dim=1)[target>0]==target[target>0]).float().mean()
learn = load_learner('', dirs.model)
learn.model.float()
# summary(learn.model, (3, 32, 32))
print("Learner loaded")
fnames = sorted(get_image_files(path/'Test'))
# preds= iu.run_inferences(learn, fnames, start=60)
preds= iu.run_inferences(learn, fnames, number_files='all')
len(preds)
# print(f'Creating dataframe in path {path_tst}')
#
# fnames = sorted(get_image_files(path_tst))
# df = iu.create_probs_df(fnames)
# df.tail(10)
print(f'Populate dataframe in path {path_tst}')
df = pd.read_csv(path/"test_df.csv")
lst = iu.add_cols_to_probs_df(df)
df.sort_values(by=['Name'])
df.to_csv(path/"test_df.csv")
df.tail(10)
print(f'Adding inference probs to the dataframe')
iu.probs_to_df(preds, df)
df.to_csv(dirs.crop+'/results_df.csv', index=False)
df.sort_values(by=['Name'], inplace=True)
print(f'Find Maximums')
df = pd.read_csv(path/"results_df.csv")
df["max_prob"] = df[["Background", "Fluke_Liver", "Fluke_Rumen"]].max(axis=1)
df.tail(10)
df.loc[df.Fluke_Liver == df.max_prob, "max_prob"] = 'Fluke-Liver'
df.loc[df.Fluke_Rumen == df.max_prob, "max_prob"] = 'Fluke-Rumen'
df.tail(10)
df.to_csv(dirs.crop+'/results_df.csv', index=False)
df.tail(10)
iu.plot_inferences(preds, df, src_path=path_tst, start=0)
# add the actual label todo
iu.plot_inferences(preds, df, src_path=path_tst, start=20)
# add the actual label todo
iu.plot_inferences(preds, df, src_path=path_tst, start=40)
# add the actual label todo
iu.plot_inferences(preds, df, src_path=path_tst, start=60)
# add the actual label todo
iu.plot_inferences(preds, df, src_path=path_tst, start=80)
# add the actual label todo
preds[-4]['filename']
len(preds)
fnames = sorted(get_image_files(path/'Test'))
fn = fnames[65]
img = open_image(fn)
pc,pi,raw_pred = learn.predict(img)
p = iu.calc_probs(raw_pred)
print(f'{p[0]:3.2f} {p[1]:3.2f} {p[2]:3.2f}')
# PIL.Image.fromarray(img.astype(np.uint8)).save(fn, quality=90)
# print(f'Label files: {len(fnames)} resaved')
pc
# data = pd.read_csv('https://s3-eu-west-1.amazonaws.com/shanebucket/downloads/uk-500.csv')
#
# data.set_index("last_name", inplace=True)
# data.head()
# data.head(5)
fn = fnames[64]
img = open_image(fn)
pc,pi,o = learn.predict(img)
fig, axes = plt.subplots(1, 4, figsize=(10, 3))
for i, ax in enumerate(axes.flat):
arr = (o[i,:,:]).numpy()
im = ax.imshow(arr, cmap='inferno', vmin=0, vmax=1)
ax.set_axis_off()
# plt.colorbar(im,ax=ax)
plt.tight_layout()
o.shape
#
from skimage.measure import label, regionprops
def _get_props(tens, layer, min_conf):
min_area = 100
arr = o[layer,:,:].numpy()
if layer == 0:
label_arr = label(arr < 1-min_conf)
else:
label_arr = label(arr > min_conf)
region_props = []
for region in regionprops(label_arr, arr, cache=True):
if region.area > min_area:
cx = int(region.centroid[1])
cy = int(region.centroid[0])
region_props.append({
"class_layer": layer,
"centroid": region.centroid,
"mean_intensity": region.mean_intensity,
"area": region.area,
"coords": region.coords,
})
return region_props
def _get_bool_mask(o):
min_conf = 0.5
arr = o[0,:,:].numpy()
mask = np.zeros((arr.shape), dtype=bool)
bgnd = get_props(o, 0, min_conf)
AAcoords = bgnd[0]["coords"]
mask[AAcoords.T.tolist()] = True
return mask
def _calc_probs(o):
mask = get_bool_mask(o)
p = [None]*o.shape[0]
for i in range(o.shape[0]):
p[i] = o[i,:,:].numpy()[mask].mean()
return p
# get boolean mask of a region
mask = get_bool_mask(o)
show_img(mask)
p = calc_probs(o)
print(f'{p[0]:3.2f} {p[1]:3.2f} {p[2]:3.2f}')
p
# print(f'{p:3.2f}')p
# print(f'{p0.mean():3.2f},{p1.mean():3.2f},{p2.mean():3.2f},{p3.mean():3.2f}')
# print(f'{(p0+p1+p2).mean():3.2f}')
min_conf = 0.2
bgnd = get_props(o, 0, min_conf)
lyr1 = get_props(o, 1, min_conf)
lyr1
lyr2 = get_props(o, 2, min_conf)
lyr2
print(bgnd[0]["area"] )
print(lyr1[0]["area"], lyr1[0]["mean_intensity"], lyr1[0]["mean_intensity"] * lyr1[0]["area"] / bgnd[0]["area"])
print(lyr2[0]["area"], lyr2[0]["mean_intensity"], lyr2[0]["mean_intensity"] * lyr2[0]["area"] / bgnd[0]["area"])
# region.mean_intensity * region.area / 314
bgnd[0]["centroid"]
print(o[0,90,90], o[1,90,90], o[2,90,90], o[3,90,90])
AAcoords = bgnd[0]["coords"]
AAcoords
arr = o[0,:,:].numpy()
bin = label(arr < 0.5) > 0
bin.max()
AA0 = o[0,:,:].numpy()[bin]
AA0.mean()
AA1 = o[1,:,:].numpy()[bin]
AA1.mean()
AA2 = o[2,:,:].numpy()[bin]
AA2.mean()
(AA0+AA1+AA2).mean()
def find_prediction_blobs(img, min_conf=0.1, min_area=100, plot=False):
RESIZE = 2.0
img = cv2.resize(img,None,fx=1.0/RESIZE, fy=1.0/RESIZE, interpolation = cv2.INTER_AREA)
min_area = int(min_area/RESIZE)
# region props seems to have region.max_intensity errors if no data not np.int
SCALE = 100
min_conf *= SCALE
img = (img * (SCALE/img.max())).astype(np.int)
img[img[:,:,0]<min_conf,0] = 0
img[img[:,:,1]<min_conf,1] = 0
predictions = []
label_image0 = label(img[:,:,0] > min_conf)
label_image1 = label(img[:,:,1] > min_conf)
for region in regionprops(label_image0, img[:,:,0], cache=True):
if region.area > min_area:
cx = int(region.centroid[1]*RESIZE)
cy = int(region.centroid[0]*RESIZE)
predictions.append({
"label": 'Strongyle',
"point": [cx,cy],
"probability": region.max_intensity.round(2),
"area": region.area
})
fill = (0,255,0)
for region in regionprops(label_image1, img[:,:,1]):
if region.area > min_area:
cx = int(region.centroid[1]*RESIZE)
cy = int(region.centroid[0]*RESIZE)
predictions.append({
"label": 'Nematodirus',
"point": [cx,cy],
"probability": region.max_intensity.round(2),
"area": region.area
})
if plot:
# show_img(imglab, figsize = (15,15))
plt.figure(figsize=(15, 15))
plt.subplot(121)
plt.imshow(label_image0, cmap='nipy_spectral')
# plt.imshow(img[:,:,0] > min_conf, cmap='nipy_spectral')
plt.axis('off')
plt.subplot(122)
plt.imshow(label_image1, cmap='nipy_spectral')
plt.axis('off')
plt.tight_layout()
plt.show()
return predictions, img